package com.yjhh.scala

/**
  *
  * 数组操作
  * 大数据是数据的集合以及对数据集合的操作技术的统称，
  * 1.数据集合：涉及数据收集、存储、搜索会有很多技术，存储Hadoop，很多情况使用Kafka来作为数据传输
  * 2.对数据集合的操作技术，目前最流行的是Spark
  *
  * Spark的框架语言是Scala，首选应用开发语言也是Scala，所以对Scala集合的操作至关重要
  * Spark中的对很多数据的操作算子和Scala中的算子一样的，所以，掌握Scala的集合操作很重要。
  * 关于Scala数组的创建与操作
  * 1.val array1 = new Array[Int](5)    制定数组类型是Int切固定长度为5
  * 2.下标与Java下标一致，下标都从0开始
  * 3.最常用的创建数组的方式是  Array[Int](5,6),背后的原理是调用了Array的工厂方法apply
  * 4.Array本身底层的实现是接住了JVM平台上的Java语言，的数组的实现，是不可变的
  * 5.想使用可变数组的话，需要导入import scala.collection.mutable.ArrayBuffer，使用ArrayBuffer实现
  * 6.ArrayBuffer默认是在末尾增加元素。
  * 7.当需要多线程并发操作时，把ArrayBuffer转化为Array非常重要，Array本身不可变动（不可删减元素）
  * 8.如果想在已经存在的数组的基础上通过作用于每个元素来生成新的元素构成的新数组，则可以使用rield语法来完成。
  *   第一点：它是在不修改已有的Array的内容的基础上完成的，非常适合大数据的处理
  *   第二点：在大数据处理中，例如Spark中的业务操作的核心思想就类似于yield，通过使用function对每个元素操作获得新的元素构成的集合，其实就是新的RDD，MApPartitionsRDD
  * 9.集合的操作可以通过丰富的操作算子，例如filter来过滤需要的条件的元素，例如map来进行每一个元素的加工
  */
object ArrayOpt {

  def main(args: Array[String]): Unit = {
    initArrayTest
    optArrayTest
  }


  private def optArrayTest = {
    import scala.collection.mutable.ArrayBuffer

    val arrayBuffer = ArrayBuffer[Int]()
    arrayBuffer += 1
    arrayBuffer += 2
    arrayBuffer += 3
    arrayBuffer += (4, 6, 5, 7, 18, 9, 10)

    arrayBuffer ++= Array(21, 22, 23)
    arrayBuffer.insert(arrayBuffer.length - 1, 100, 1001);

    arrayBuffer.remove(arrayBuffer.length - 2, 2)
    arrayBuffer.toArray
    for (item <- arrayBuffer) {
      println("*****" + item)
    }

    for (i <- 0 until arrayBuffer.length) print(arrayBuffer(i) + "  ")
    println()
    for (i <- 0 until(arrayBuffer.length, 2)) print(arrayBuffer(i) + "  ") //间隔打印
    println()
    for (i <- (0 until arrayBuffer.length).reverse) print(arrayBuffer(i) + "  ") //反转
    println()
    println("sum=" + arrayBuffer.sum)
    println("max=" + arrayBuffer.max)
    val array = arrayBuffer.toArray
    scala.util.Sorting.quickSort(array)  //排序
    for (item <- array) {
      print(" " + item)
    }
    println()
    println("quickSort="+array.mkString(","))
    println("quickSort="+array.mkString("<<<<",",",">>>>"))

    val names = for (item <- array) yield item + 1     //返回一个新的数组
    println("yield="+names.mkString(","))

    val arrayEven = for (item <- array if item % 2 == 0) yield item   //用守卫找出偶数
    println("arrayEven="+arrayEven.mkString(","))

    println(array.filter{x => x % 2 == 0}.mkString(","))
    println(array.filter{_ % 2 == 0}.mkString(","))
    println(array.filter(_ % 2 == 0).map( _ * 10).mkString(","))

  }

  /**
    * 初始化数组，通过比较发现，用new生产的数组，5个元素都有默认值，但是不带new的数组会直接把括号中的元素作为值存储
    */
  private def initArrayTest = {
    val array1 = new Array[Int](5)
    array1(0) = 10
    for (item <- array1) {
      println(item)
    }

    val array2 = Array(5, 6, 7) // 此处可以省略掉Int泛型，因为有类型推导
    Array.apply(5, 6)
    for (item <- array2) {
      println("---" + item)
    }

  }
}
